/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Estructuras;

import java.util.LinkedList;

/**
 *
 * @author Luis E Sosa S
 */
public class runqueue {

 //prioridad para el runqueue
 private short prioridad;
 //numero de procesos activos
 private int nr_running;
 private  colaProcesos activos;
 private  colaProcesos expirados;
 private  colaProcesos expropiados;
 

  public runqueue(short prioridad) {
    this.prioridad = prioridad;
    activos = new colaProcesos();
    expirados = new colaProcesos();
    expropiados = new colaProcesos();
    nr_running = 0;
  }


  /* funcion llamada cuando una tarea cambia a estado runnable
   * este coloca el scheduling_entity (proceso) dentro del scheduler_class
   */
 synchronized boolean   enqueue_task(Task_struct ts){
    boolean aux = activos.agregar(ts);
    if(aux){
      this.nr_running++;
      return true;
    }
    else
      return false;
 }





  /*
   Agrega un elemento a la cola de expirados
   */
  public boolean agregarExpirados(Task_struct ts){
    if(ts == null)
      return false;
    if(this.expirados.agregar(ts)){
       nr_running++;
       return true;
    }
    else
       return false;
  }
  



  
  //retorna la siguiente tarea a ejecutar
  Task_struct pick_next_task(){
  //si existe algun proceso expropiado se ejecuta primero
  if(expropiados != null && expropiados.tamano()!=0){
    nr_running--;
    return expropiados.siguiente();
  }
  if(activos != null && activos.tamano() != 0){
          nr_running--;
          return activos.siguiente();
  }
  else{//si la cola de activos esta vacia se cambia a la cola de expirados
        // System.out.println("Swap en colas activas " +
         //        "y expirados para prioridad" + this.prioridad );
         colaProcesos aux;
         aux = this.activos;
         this.activos = this.expirados;
         this.expirados = aux;
         return null;
     }
 }


   /**
    *Cuando una tarea no puede seguir ejecutandose esta funcion es llamada
    * para guardar el schedling_entity fuera del scheduler
    * esta decrementa la variable nr_running
    */
   Task_struct dequeue_task(Task_struct ts){
     nr_running--;
     return activos.eliminar(ts);
 }


   /*
  * Agrega en la lista de procesos expropiados
  * la sched_entity se
  */
 void agregarEnExpropiados(Task_struct ts){
     expropiados.agregar(ts);
     nr_running++;
 }

}
